export default class Util {
    constructor() { }
    // 时间转换
    public static timeFormat(time: any = Number(new Date().getTime()), fmt = 'yyyy/mm/dd'): string {
        if (/^\d+$/.test(time)) {
            // 如果为纯数字则为时间戳
            // 如果dateTime长度为10或者13，则为秒和毫秒的时间戳，如果超过13位，则为其他的时间格式
            if (time.toString().length == 10) time *= 1000;
        }
        let date = new Date(time);
        let ret;
        let opt: any = {
            'y+': date.getFullYear().toString(), // 年
            'm+': (date.getMonth() + 1).toString(), // 月
            'd+': date.getDate().toString(), // 日
            'h+': date.getHours().toString(), // 时
            'M+': date.getMinutes().toString(), // 分
            's+': date.getSeconds().toString(), // 秒
            'q+': Math.floor((date.getMonth() + 3) / 3).toString(), // 季度
            S: date.getMilliseconds().toString(), // 毫秒
            // 有其他格式化字符需求可以继续添加，必须转化成字符串
        };
        for (let k in opt) {
            ret = new RegExp('(' + k + ')').exec(fmt);
            if (ret) {
                fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'));
            }
        }
        return fmt;
    }

    // 获取微信code
    public static getWxCode(): Promise<string> {
        return new Promise((resolve, reject) => {
            uni.login({
                provider: 'weixin',
                success: (res) => {
                    resolve(res.code);
                },
                fail: (err) => {
                    reject(err.authErrorScope);
                },
            });
        });
    }

    // 获取用户信息
    public static getUserInfo(): Promise<any> {
        return new Promise((resolve, reject) => {
            wx.getUserProfile({
                desc: '登录',
                success: async (res: any) => {
                    resolve(res.userInfo);
                },
                fail: (err) => {
                    reject(err);
                },
            });
        });
    }

    // 检查登录是否过期
    public static checkSession(): Promise<any> {
        return new Promise((resolve, reject) => {
            wx.checkSession({
                success(res) {
                    if (res.errMsg == 'checkSession:ok') {
                        resolve(1);
                    }
                },
                fail(err) {
                    reject(err);
                },
            });
        });
    }
    public static mergeClone(items: any): any {
        let result: any = Array.isArray(items) ? [] : {};
        Object.keys(items).forEach(key => {
            if (typeof items[key] === 'object' && items[key] !== null) {
                result[key] = this.mergeClone(items[key]);
            } else {
                result[key] = items[key];
            }
        });
        return result;
    }
    /**
    * 数组去重
    * @param arr: Array<any> 需要去重的数组
    * @returns result: Array<any> 去重后的数组
    */
    public unique(arr: Array<any>): Array<any> {
        let result: Array<any> = [];
        let obj: any = {}
        arr.forEach(item => {
            if (!obj[item]) {
                obj[item] = true;
                result.push(item)
            }
        })
        return result;
    }
    /**
    * 数组分页
    * @param array 需要分页的数组
    * @param pageNo 页码
    * @param pageSize 每页显示条数
    * @returns 
    */
    public static pagination(array: Array<any>, pageNo = 1 as number, pageSize = 10 as number) {
        try {
            let offset = (pageNo - 1) * pageSize;
            return (offset + pageSize >= array.length) ? array.slice(offset, array.length) : array.slice(offset, offset + pageSize)
        } catch (e) {
            console.error(e)
        }
    }
    /**
     * 数据响应式处理
     * @param obj 需要监听的对象源
     * @param key 需要监听的属性
     * @param val 属性值
     */
    public static defineReactive(obj: object, key: string, val = '') {
        Object.defineProperty(obj, key, {
            get() {
                return val;
            },
            set(newVal) {
                val = newVal;
            },
            enumerable: true,
            configurable: true,
        });
    }
}